/*****************************************************************************
 * $LastChangedDate: 2010-06-26 21:01:07 -0400 (Sat, 26 Jun 2010) $
 * @file
 * @author  Jim E. Brooks  http://www.palomino3d.org
 * @brief   Math functions (vertex transformations).
 * @remarks math/matrix_funcs.hh has the set of Matrix*() functions.
 *//*
 * LEGAL:   COPYRIGHT (C) 2010 JIM E. BROOKS
 *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
 *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
 *****************************************************************************/

#ifndef MATH_FUNCS_TRANSFORM_HH
#define MATH_FUNCS_TRANSFORM_HH 1

#include "math/vertex.hh"
#include "math/matrix.hh"

namespace math {

////////////////////////////////////////////////////////////////////////////////
////////////////////////  Transform*() functions  //////////////////////////////
////////////////////////////////////////////////////////////////////////////////

/*****************************************************************************
 * local --> world
 * Transform vertex from local/object space to world space.
 *****************************************************************************/
INLINE WorldVertex
TransformLocal2World( const LocalVertex& lv, const Matrix& objectMatrix )
{
    return lv * objectMatrix;
}

/*****************************************************************************
 * world --> eye
 * Transform vertex from world space to eye space.
 *****************************************************************************/
INLINE EyeVertex
TransformWorld2Eye( const WorldVertex& wv, const Matrix& viewMatrix )
{
    return wv * viewMatrix;
}

////////////////////////////////////////////////////////////////////////////////
//////////  functions that transform a vertex thru a const matrix  /////////////
////////////////////////////////////////////////////////////////////////////////

/*****************************************************************************
 * Rotate then translate.
 *****************************************************************************/
template<typename DEST,typename SRC,typename MATRIX>
DEST
RotateTranslate( const SRC& v, const MATRIX& m )
{
    return DEST( v[XX] * m[Xx] + v[YY] * m[Xy] + v[ZZ] * m[Xz] + m[Ox],
                 v[XX] * m[Yx] + v[YY] * m[Yy] + v[ZZ] * m[Yz] + m[Oy],
                 v[XX] * m[Zx] + v[YY] * m[Zy] + v[ZZ] * m[Zz] + m[Oz] );
}

/*****************************************************************************
 * Translate then rotate.
 *****************************************************************************/
template<typename DEST,typename SRC,typename MATRIX>
DEST
TranslateRotate( const SRC& src, const MATRIX& m )
{
    const fp x = src[XX] + m[Ox];
    const fp y = src[YY] + m[Oy];
    const fp z = src[ZZ] + m[Oz];
    return DEST( x * m[Xx] + y * m[Xy] + z * m[Xz],
                 x * m[Yx] + y * m[Yy] + z * m[Yz],
                 x * m[Zx] + y * m[Zy] + z * m[Zz] );
}

} // namespace math

#endif // MATH_FUNCS_TRANSFORM_HH
